package com.it.homework2;

/**
 * 给定一个数组，将数组中的元素向右移动 k 个位置，其中 k 是非负数。
 * <p>
 * 示例:
 * 输入: nums = [1,2,3,4,5,6,7], k = 3
 * 输出: [5,6,7,1,2,3,4]
 */

/**
 * RotateArray 类提供了一个静态方法 rotate，
 * 用于将整型数组中的元素向右旋转指定的位数。
 */
public class RotateArray {
    /**
     * 将给定的整型数组 nums 中的元素向右旋转 k 位。
     *
     * @param nums 待旋转的整型数组。
     * @param k    旋转的位数。
     */
    public static void rotate(int[] nums, int k) {
        // 处理 k 大于数组长度的情况，确保 k 非负且小于数组长度
        k %= nums.length;

        //妙啊，真是妙蛙种子吃着妙脆角进了米奇妙妙屋，妙到家了！

        // 反转整个数组，为后续的局部反转操作做准备
        reverse(nums, 0, nums.length - 1);
        // 反转前 k 个元素，实现右旋转的效果
        reverse(nums, 0, k - 1);
        // 反转剩余的元素，完成整个右旋转操作
        reverse(nums, k, nums.length - 1);
    }

    /**
     * 反转整型数组 nums 中从索引 start 到 end 的元素。
     *
     * @param nums  待反转的整型数组。
     * @param start 反转开始的索引。
     * @param end   反转结束的索引。
     */
    private static void reverse(int[] nums, int start, int end) {
        while (start < end) {
            // 交换对称位置的元素以实现反转
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }

    /**
     * 主函数，演示如何使用 rotate 方法旋转数组，并打印旋转后的数组。
     *
     * @param args 命令行参数。
     */
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7};
        rotate(nums, 3);
        // 打印旋转后的数组
        for (int num : nums) {
            System.out.print(num + " ");
        }
        // 预期输出: 5 6 7 1 2 3 4
    }
}
